package indicators

import (
	"github.com/duke-git/lancet/v2/slice"
	"math"
	"sort"
	"stock/server/internal/pkg/stock/typeutil"
)

// MA 均线
func MA(klines []typeutil.Kline, ma []int) []typeutil.Kline {
	// 当 ma 为 nil 时,需要对数据分时线
	if ma == nil {
		ma = append(ma, -1)
	}

	// 去重
	ma = slice.Unique(ma)
	// 排序
	sort.Ints(ma)

	// 存储均线的值
	maVal := make(map[int]float64)

	for i, line := range klines {
		lineMa := make(map[int]float64, len(ma))
		for _, num := range ma {
			// 累加
			maVal[num] += line.ClosePrice
			// 过滤 -1, 若k线长度小于均线，则只累加
			if num != -1 && i-num+1 < 0 {
				continue
			}

			// 过滤 -1, 大于均线的 k 线才需要计算
			if num != -1 && i-num+1 > 0 {
				// 计算移除的 k 线
				index := 0
				if i-num > 0 {
					index = i - num
				}

				maVal[num] = maVal[num] - klines[index].ClosePrice
			}

			// 若 num = -1, 则直接处于当前 k线的索引
			dividend := num
			if num == -1 {
				dividend = i + 1
			}

			lineMa[num] = math.Ceil(maVal[num]/float64(dividend)*1e3) / 1e3
		}

		klines[i].MA = lineMa
	}

	return klines
}
